import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 读取CSV文件
df = pd.read_csv('combined_table.csv')

# 提取年份信息
df['year'] = pd.to_datetime(df['create_time']).dt.year

# 筛选出2023年的数据
df_2023 = df[df['year'] == 2023]

# 计算2023年每个客户的总需求量
customer_demand_2023 = df_2023.groupby('khmc')['fhdw'].sum().reset_index()

print("2023年客户需求量分析：")
print(customer_demand_2023)


# 筛选出2023年需求量前 10 的客户
top_10_demand_2023 = customer_demand_2023.nlargest(10, 'fhdw')
print("2023年需求量前 10 的客户")
print(top_10_demand_2023)

# 可视化2023年客户总需求量（前 10）
plt.figure(figsize=(10, 6))
sns.barplot(data=top_10_demand_2023, x='khmc', y='fhdw')
plt.title('2023年客户总需求量（前 10）')
plt.xlabel('客户名称')
plt.ylabel('需求吨位')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()

# 分析2023年客户的需求频率
customer_frequency_2023 = df_2023.groupby('khmc').size().reset_index(name='order_count')

print("2023年客户需求频率：")
print(customer_frequency_2023)

# 筛选出2023年需求频率前 10 的客户
top_10_frequency_2023 = customer_frequency_2023.nlargest(10, 'order_count')
print("2023年需求频率前10的客户")
print(top_10_frequency_2023)

# 可视化2023年客户需求频率（前 10）
plt.figure(figsize=(10, 6))
sns.barplot(data=top_10_frequency_2023, x='khmc', y='order_count')
plt.title('2023年客户需求频率（前 10）')
plt.xlabel('客户名称')
plt.ylabel('订单数量')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()


# 分析2023年客户的消费金额
customer_consume_2023 = df_2023.groupby('khmc')['hk'].sum().reset_index()

print("2023年客户消费金额：")
print(customer_consume_2023)

# 筛选出2023年消费金额前 10 的客户
top_10_consume_2023 = customer_consume_2023.nlargest(10, 'hk')
print("2023年消费金额前10的客户")
print(top_10_consume_2023)

# 可视化2023年客户消费金额（前 10）
plt.figure(figsize=(10, 6))
sns.barplot(data=top_10_consume_2023, x='khmc', y='hk')
plt.title('2023年客户消费金额（前 10）')
plt.xlabel('客户名称')
plt.ylabel('消费金额')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()

# 将 create_time 列转换为 datetime 类型
df['create_time'] = pd.to_datetime(df['create_time'])

# 筛选出 2023 年的数据
df_2023 = df[df['year'] == 2023]

# 提取月份信息
df_2023.loc[:, 'month'] = df_2023['create_time'].dt.month

# 按照客户名称和月份分组，计算订单数
order_count_by_month = df_2023.groupby(['khmc','month'])['id_x'].count().reset_index()

# 计算每个客户的总订单数
total_order_count = order_count_by_month.groupby('khmc')['id_x'].sum()

# 计算每个客户的平均每月订单数
average_monthly_order_count = total_order_count / 12

# 打印结果
print("客户的订购频率：")
print(average_monthly_order_count)

# 找出前十名客户
top_10_customers = average_monthly_order_count.nlargest(10)
print("2023年订购频率前10的客户")
print(top_10_customers)

# 可视化前十名客户的订购频率
plt.figure(figsize=(10, 15))
plt.bar(top_10_customers.index, top_10_customers)
plt.title('前十名客户订购频率',fontsize=16)
plt.xlabel('客户',fontsize=16)
plt.ylabel('平均每月订购数',fontsize=16)
plt.xticks(rotation=45)
plt.show()

# 根据 khmc 列对不同客户统计 hplx_x 中 0 和 1 的值的数量
customer_stats = df_2023.groupby('khmc')['hplx_x'].value_counts().unstack().fillna(0)

# 统计客户购买水泥和矿粉的数量
customer_stats['cement_count'] = customer_stats[0]
customer_stats['mineral_powder_count'] = customer_stats[1]

# 提取购买矿粉前十的客户
top_10_mineral_powder_customers = customer_stats['mineral_powder_count'].nlargest(10).index
print("购买矿粉前十的客户")
print(top_10_mineral_powder_customers)

# 提取购买水泥前十的客户
top_10_cement_customers = customer_stats['cement_count'].nlargest(10).index
print("购买水泥前十的客户")
print(top_10_cement_customers)

# 可视化购买矿粉前十的客户
plt.figure(figsize=(10, 15))
plt.bar(top_10_mineral_powder_customers, customer_stats.loc[top_10_mineral_powder_customers,'mineral_powder_count'])
plt.title('购买矿粉前10的客户', fontsize=16)  # 增大标题字体大小
plt.xlabel('客户', fontsize=14)  # 增大 x 轴标签字体大小
plt.ylabel('矿粉数', fontsize=14)  # 增大 y 轴标签字体大小
plt.xticks(rotation=45, fontsize=12)  # 增大 x 轴刻度标签字体大小
plt.show()

# 可视化购买水泥前十的客户
plt.figure(figsize=(10, 15))
plt.bar(top_10_cement_customers, customer_stats.loc[top_10_cement_customers, 'cement_count'])
plt.title('购买水泥前十客户', fontsize=16)
plt.xlabel('客户', fontsize=14)
plt.ylabel('水泥数', fontsize=14)
plt.xticks(rotation=45, fontsize=12)  # 增大 x 轴刻度标签字体大小
plt.show()
